import os
import json
import time
import pandas as pd
from openai import OpenAI

# 初始化OpenAI客户端
client = OpenAI(
    base_url="https://ark.cn-beijing.volces.com/api/v3",
    api_key="330f54b7-915b-48a9-9599-c5e47c118cb5"  # 建议改为环境变量读取：os.getenv("ARK_API_KEY")
)


def get_reasons_with_prob(question: str) -> dict:
    """
    调用API仅获取问题的原因及概率（不做唯一性判断）
    """
    # 构建系统提示词：明确禁止LLM判断唯一性，仅输出原因和概率
    system_prompt = """
    你是拓竹科技3D打印领域的专家，需完成以下任务：
    1. 分析用户提出的3D打印问题，列出该问题出现的所有可能原因；
    2. 为每个原因分配合理概率，所有原因的概率之和必须为100%（概率需带百分号）；
    3. 严格按照以下JSON格式输出结果（仅保留这两个字段，禁止添加其他字段）：
    {
        "用户问题": "用户的原始问题",
        "原因及概率": [
            {"原因": "具体原因描述", "概率": "XX%"}
        ]
    }
    参考案例：
    [
        {
            "用户问题": "我能打印16色吗？",
            "原因及概率": [
                {"原因": "用户未明确打印机型号，不同型号支持色数不同", "概率": "90%"},
                {"原因": "用户混淆打印色数与材料组合概念", "概率": "10%"}
            ]
        },
        {
            "用户问题": "我的A1 mini能打印16色吗？",
            "原因及概率": [
                {"原因": "A1 mini为单喷头，仅支持单色打印", "概率": "100%"}
            ]
        }
    ]
    注意：无需判断解决办法是否唯一，仅输出上述两个字段即可！
    """

    try:
        # 调用API获取原因及概率
        response = client.chat.completions.create(
            model="deepseek-v3-1-250821",
            messages=[
                {"role": "system", "content": system_prompt.strip()},
                {"role": "user", "content": question}
            ]
        )

        # 解析API返回结果
        response_content = response.choices[0].message.content.strip()
        if response_content.startswith('[') and response_content.endswith(']'):
            result = json.loads(response_content)[0]  # 处理列表格式
        else:
            result = json.loads(response_content)

        # 验证必要字段是否存在
        if "用户问题" not in result or "原因及概率" not in result:
            raise KeyError("API返回缺少必要字段（用户问题/原因及概率）")
        if not isinstance(result["原因及概率"], list) or len(result["原因及概率"]) == 0:
            raise ValueError("原因及概率列表为空或格式错误")

        return result

    except json.JSONDecodeError:
        return {
            "用户问题": question,
            "原因及概率": [{"原因": "API返回格式错误，无法解析", "概率": "100%"}]
        }
    except (KeyError, ValueError) as e:
        return {
            "用户问题": question,
            "原因及概率": [{"原因": f"API返回数据异常：{str(e)}", "概率": "100%"}]
        }
    except Exception as e:
        return {
            "用户问题": question,
            "原因及概率": [{"原因": f"获取原因失败：{str(e)}", "概率": "100%"}]
        }


def judge_uniqueness_by_code(reasons: list) -> str:
    """
    纯代码逻辑判断解决办法是否唯一
    规则：
    1. 原因唯一 → 解决办法唯一
    2. 原因不唯一但存在概率>90%的原因 → 解决办法唯一
    3. 其他情况 → 解决办法不唯一
    """
    if len(reasons) == 1:
        return "是"
    # 遍历原因，检查是否有概率>90%的项
    for reason in reasons:
        try:
            prob = int(reason["概率"].strip('%'))
            if prob > 90:
                return "是"
        except (ValueError, KeyError):
            # 概率格式错误时，默认按"不唯一"处理
            return "否"
    return "否"


def process_excel_to_json(file_path: str, question_column: str = "问题") -> str:
    """
    读取Excel中的问题列，通过代码逻辑判断唯一性，生成最终JSON结果
    """
    try:
        # 读取Excel文件
        df = pd.read_excel(file_path)

        # 检查问题列是否存在
        if question_column not in df.columns:
            raise ValueError(f"Excel中未找到列名'{question_column}'，请检查列名是否正确")

        # 提取非空问题
        questions = df[question_column].dropna().astype(str).tolist()
        total_questions = len(questions)
        print(f"共检测到{total_questions}个有效问题，开始处理...\n")

        # 记录总处理时间
        total_start_time = time.time()

        # 处理每个问题并生成结果
        result = []
        for idx, q in enumerate(questions, 1):
            start_time = time.time()
            print(f"正在处理第{idx}/{total_questions}个问题：{q}")

            # 步骤1：获取原因及概率（LLM仅做此步）
            reason_data = get_reasons_with_prob(q)
            reasons = reason_data["原因及概率"]

            # 步骤2：代码逻辑判断唯一性
            is_unique = judge_uniqueness_by_code(reasons)

            # 构建最终结果字典
            final_item = {
                "序号": idx,
                "用户问题": reason_data["用户问题"],
                "原因及概率": reasons,
                "解决办法是否唯一": is_unique
            }
            result.append(final_item)

            # 打印单个问题处理信息
            elapsed_time = round(time.time() - start_time, 2)
            print(f"第{idx}个问题处理完成，耗时：{elapsed_time}秒，解决办法{'唯一' if is_unique == '是' else '不唯一'}\n")

        # 打印总耗时
        total_elapsed = round(time.time() - total_start_time, 2)
        print(f"所有问题处理完成！总耗时：{total_elapsed}秒\n")

        # 转换为JSON字符串（确保中文正常显示）
        return json.dumps(result, ensure_ascii=False, indent=2)

    except FileNotFoundError:
        return json.dumps({"错误": f"文件不存在：{file_path}"}, ensure_ascii=False)
    except Exception as e:
        return json.dumps({"错误": str(e)}, ensure_ascii=False)


if __name__ == "__main__":
    # Excel文件路径
    excel_path = r"E:\pyPro\pythonProject1\TuiZhu\data\dialog.xlsx"

    # 处理并生成结果
    json_result = process_excel_to_json(excel_path, question_column="问题")

    # 打印并保存结果
    print("最终JSON结果：")
    print(json_result)

    with open("问题唯一性判断结果.json", "w", encoding="utf-8") as f:
        f.write(json_result)
    print("\n结果已保存至：问题唯一性判断结果.json")